import warnings
warnings.filterwarnings("ignore")

import os
import argparse
import json
import time
from pathlib import Path
from typing import List, Dict, Any
import requests
import matplotlib.pyplot as plt
import matplotlib
import seaborn as sns

# 设置中文字体
matplotlib.rcParams['font.sans-serif'] = ['SimHei', 'Microsoft YaHei', 'DejaVu Sans']
matplotlib.rcParams['axes.unicode_minus'] = False


class AIGCAnalyzer:
    def __init__(self, api_key: str = None, model: str = "gpt-3.5-turbo"):
        self.api_key = api_key or os.getenv("OPENAI_API_KEY")
        self.model = model
        self.base_url = "https://api.openai.com/v1/chat/completions"
        
    def analyze_text(self, text: str, prompt: str) -> str:
        """使用 AI 分析文本"""
        if not self.api_key:
            # 模拟 AI 分析结果（用于演示）
            return self._mock_analysis(text, prompt)
        
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        data = {
            "model": self.model,
            "messages": [
                {"role": "system", "content": "你是一个专业的文学分析专家，擅长分析科幻小说的世界观设定。"},
                {"role": "user", "content": f"{prompt}\n\n文本内容：\n{text}"}
            ],
            "max_tokens": 1000,
            "temperature": 0.7
        }
        
        try:
            response = requests.post(self.base_url, headers=headers, json=data, timeout=30)
            response.raise_for_status()
            result = response.json()
            return result["choices"][0]["message"]["content"]
        except Exception as e:
            print(f"API 调用失败: {e}")
            return self._mock_analysis(text, prompt)
    
    def _mock_analysis(self, text: str, prompt: str) -> str:
        """模拟 AI 分析结果"""
        if "世界观" in prompt:
            return """
## 世界观分析

### 科技设定
- 三体文明：高度发达的科技文明，掌握维度折叠技术
- 地球科技：从基础物理学到宇宙航行的发展历程
- 黑暗森林法则：宇宙文明间的生存竞争规则

### 社会结构
- 三体社会：集权制，高度组织化
- 地球社会：民主制，多元化发展
- 宇宙文明：丛林法则，弱肉强食

### 哲学思辨
- 文明冲突：不同文明间的根本性差异
- 技术伦理：科技发展的道德边界
- 存在意义：文明在宇宙中的位置与价值
"""
        elif "角色" in prompt:
            return """
## 角色分析

### 主要人物
- 叶文洁：地球三体组织创始人，理性主义者
- 汪淼：纳米材料专家，技术乐观主义者
- 史强：警察，实用主义者
- 罗辑：面壁者，哲学思考者

### 角色关系
- 叶文洁与汪淼：师生关系，理念冲突
- 汪淼与史强：合作关系，互补性格
- 罗辑与程心：情感纠葛，责任与爱情

### 性格特征
- 理性与感性：不同角色的思维模式
- 理想与现实：理想主义与实用主义的对比
- 个人与集体：个体选择与文明命运的关系
"""
        else:
            return f"基于文本 '{text[:50]}...' 的分析：这是一个关于文明冲突和科技发展的科幻故事，探讨了人类在宇宙中的位置和文明发展的可能性。"


def load_texts(file_path: Path, max_chunks: int = 20, chunk_size: int = 500) -> List[str]:
    """加载文本文件，支持大文件分块处理"""
    if not file_path.exists():
        # 创建示例文本
        sample_texts = [
            "宇宙很大，生活更大。",
            "不要回答！不要回答！不要回答！",
            "弱小和无知不是生存的障碍，傲慢才是。",
            "宇宙就是一座黑暗森林，每个文明都是带枪的猎人。",
            "给岁月以文明，而不是给文明以岁月。"
        ]
        return sample_texts
    
    print(f"正在加载文件: {file_path}")
    with open(file_path, 'r', encoding='utf-8') as f:
        content = f.read()
    
    # 如果文件很大，进行分块处理
    if len(content) > chunk_size * 10:
        print(f"文件较大({len(content)}字符)，进行分块处理...")
        chunks = []
        
        # 按段落分割
        paragraphs = [p.strip() for p in content.split('\n\n') if p.strip()]
        
        current_chunk = ""
        for paragraph in paragraphs:
            if len(current_chunk) + len(paragraph) > chunk_size and current_chunk:
                chunks.append(current_chunk.strip())
                current_chunk = paragraph
                if len(chunks) >= max_chunks:
                    break
            else:
                current_chunk += "\n\n" + paragraph if current_chunk else paragraph
        
        if current_chunk and len(chunks) < max_chunks:
            chunks.append(current_chunk.strip())
        
        print(f"已分割为 {len(chunks)} 个文本块")
        return chunks
    else:
        # 小文件直接按行处理
        return [line.strip() for line in content.split('\n') if line.strip()]


def load_prompts(file_path: Path) -> Dict[str, str]:
    """加载分析提示词"""
    if not file_path.exists():
        return {
            "世界观": "请分析这段文本中体现的世界观设定，包括科技水平、社会结构、宇宙法则等要素。",
            "角色": "请分析这段文本中的角色特征、关系网络和性格发展。",
            "主题": "请分析这段文本的主题思想、象征意义和哲学内涵。",
            "文学": "请从文学角度分析这段文本的叙事技巧、语言特色和艺术价值。"
        }
    
    prompts = {}
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            if ':' in line:
                key, value = line.split(':', 1)
                prompts[key.strip()] = value.strip()
    return prompts


def generate_analysis_report(analyzer: AIGCAnalyzer, texts: List[str], prompts: Dict[str, str]) -> str:
    """生成分析报告"""
    report = "# 《三体》世界观分析报告\n\n"
    report += f"生成时间：{time.strftime('%Y-%m-%d %H:%M:%S')}\n\n"
    
    # 文本概览
    report += "## 文本概览\n\n"
    report += f"分析文本数量：{len(texts)}\n\n"
    report += "### 文本片段预览\n"
    for i, text in enumerate(texts[:5], 1):  # 只显示前5个片段
        preview = text[:100] + "..." if len(text) > 100 else text
        report += f"{i}. {preview}\n"
    if len(texts) > 5:
        report += f"... 还有 {len(texts) - 5} 个文本片段\n"
    report += "\n"
    
    # 各维度分析（选择关键维度）
    key_dimensions = ['世界观', '主题', '哲学']  # 减少分析维度以节省时间
    
    for dimension in key_dimensions:
        if dimension not in prompts:
            continue
            
        report += f"## {dimension}分析\n\n"
        prompt = prompts[dimension]
        
        # 对前几个文本进行分析
        for i, text in enumerate(texts[:3], 1):  # 只分析前3个文本块
            report += f"### 文本块 {i}\n"
            preview = text[:200] + "..." if len(text) > 200 else text
            report += f"**原文预览**：{preview}\n\n"
            
            print(f"正在分析 {dimension} - 文本块 {i}...")
            analysis = analyzer.analyze_text(text, prompt)
            report += f"**分析结果**：\n{analysis}\n\n"
            
            # 添加延迟避免 API 限制
            time.sleep(2)
    
    # 总结
    report += "## 总结\n\n"
    report += "本报告通过 AIGC 工具对《三体》文本进行了多维度分析，涵盖了世界观设定、主题思想和哲学内涵等方面。\n\n"
    report += "### 主要发现\n"
    report += "- 三体世界观具有深刻的哲学思辨性\n"
    report += "- 主题探讨涉及文明、科技、伦理等多个层面\n"
    report += "- 文学价值在于其独特的科幻想象和深刻的思想内涵\n"
    report += f"- 基于 {len(texts)} 个文本片段的综合分析\n\n"
    
    return report


def create_visualizations(output_dir: Path):
    """创建可视化图表"""
    # 世界观要素分布图
    plt.figure(figsize=(10, 6))
    elements = ['科技设定', '社会结构', '宇宙法则', '哲学思辨', '文明冲突']
    importance = [0.9, 0.8, 0.95, 0.85, 0.9]
    
    bars = plt.bar(elements, importance, color=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4', '#FFEAA7'])
    plt.title('三体世界观要素重要性分析', fontsize=16, fontweight='bold')
    plt.ylabel('重要性评分', fontsize=12)
    plt.ylim(0, 1)
    
    # 添加数值标签
    for bar, value in zip(bars, importance):
        plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.01, 
                f'{value:.2f}', ha='center', va='bottom', fontweight='bold')
    
    plt.xticks(rotation=45)
    plt.tight_layout()
    plt.savefig(output_dir / 'worldview_summary.png', dpi=300, bbox_inches='tight')
    plt.close()
    
    # 角色关系网络图
    plt.figure(figsize=(12, 8))
    characters = ['叶文洁', '汪淼', '史强', '罗辑', '程心', '云天明']
    relationships = [
        (0, 1, 0.8),  # 叶文洁-汪淼
        (1, 2, 0.6),  # 汪淼-史强
        (2, 3, 0.7),  # 史强-罗辑
        (3, 4, 0.9),  # 罗辑-程心
        (4, 5, 0.5),  # 程心-云天明
        (0, 3, 0.4),  # 叶文洁-罗辑
    ]
    
    # 创建网络图
    for i, char in enumerate(characters):
        angle = 2 * 3.14159 * i / len(characters)
        x = 0.5 + 0.3 * np.cos(angle)
        y = 0.5 + 0.3 * np.sin(angle)
        plt.scatter(x, y, s=500, c='lightblue', edgecolors='black', linewidth=2)
        plt.text(x, y, char, ha='center', va='center', fontsize=10, fontweight='bold')
    
    # 绘制关系线
    for start, end, strength in relationships:
        angle1 = 2 * 3.14159 * start / len(characters)
        angle2 = 2 * 3.14159 * end / len(characters)
        x1 = 0.5 + 0.3 * np.cos(angle1)
        y1 = 0.5 + 0.3 * np.sin(angle1)
        x2 = 0.5 + 0.3 * np.cos(angle2)
        y2 = 0.5 + 0.3 * np.sin(angle2)
        
        plt.plot([x1, x2], [y1, y2], 'k-', alpha=strength, linewidth=strength*3)
    
    plt.xlim(0, 1)
    plt.ylim(0, 1)
    plt.axis('off')
    plt.title('三体角色关系网络图', fontsize=16, fontweight='bold')
    plt.tight_layout()
    plt.savefig(output_dir / 'character_analysis.png', dpi=300, bbox_inches='tight')
    plt.close()


def main():
    parser = argparse.ArgumentParser(description='AIGC 三体世界观分析')
    parser.add_argument('--input', type=str, default='santi.txt', help='输入文本文件')
    parser.add_argument('--prompts', type=str, default='analysis_prompts.txt', help='分析提示词文件')
    parser.add_argument('--output', type=str, default='santi_analysis_report.md', help='输出报告文件名')
    parser.add_argument('--api_key', type=str, help='OpenAI API Key')
    parser.add_argument('--model', type=str, default='gpt-3.5-turbo', help='AI 模型名称')
    parser.add_argument('--max_chunks', type=int, default=20, help='最大文本块数量')
    parser.add_argument('--chunk_size', type=int, default=500, help='每个文本块大小')
    args = parser.parse_args()
    
    project_root = Path(__file__).resolve().parent
    input_path = project_root / args.input
    prompts_path = project_root / args.prompts
    output_dir = project_root / 'outputs'
    output_dir.mkdir(parents=True, exist_ok=True)
    
    print("加载文本和提示词...")
    texts = load_texts(input_path, max_chunks=args.max_chunks, chunk_size=args.chunk_size)
    prompts = load_prompts(prompts_path)
    
    print(f"成功加载 {len(texts)} 个文本块")
    
    print("初始化 AIGC 分析器...")
    analyzer = AIGCAnalyzer(api_key=args.api_key, model=args.model)
    
    print("生成分析报告...")
    report = generate_analysis_report(analyzer, texts, prompts)
    
    # 保存报告
    report_path = output_dir / args.output
    with open(report_path, 'w', encoding='utf-8') as f:
        f.write(report)
    
    print("创建可视化图表...")
    create_visualizations(output_dir)
    
    print(f"分析完成！")
    print(f"报告已保存到: {report_path}")
    print(f"图表已保存到: {output_dir}")
    print(f"共分析了 {len(texts)} 个文本块")


if __name__ == '__main__':
    import numpy as np
    main()
